package org.example.enums;

/**
 * 安全类型
 * @author shenguangyang
 */
public enum SecurityTypeEnum {
        /**
         * 无
         */
        NONE,
        /**
         * 签名，通常用于参数签名，防止参数被非法篡改，最常见的是修改金额等重要敏感参数，
         * sign的值一般是将所有非空参数按照升续排序然后+token+key+ts+nonce(随机数)
         * 拼接在一起，然后使用某种加密算法进行加密，这种方式的好处就是，当被劫持后，修改
         * 其中的参数值，然后再继续调用接口，虽然参数的值被修改了，但是因为攻击者并不清楚
         * sign是如何计算出来的，所以即可是篡改参数的值，但没法修改sign的值，当服务器调用
         * 接口前会按照sign的规则重新计算出sign的值然后和接口传递的sign参数的值做比较，
         * 如果相等表示参数值没有被篡改，如果不等，表示参数被非法篡改了，则不会返回真实的响应信息。
         *
         * 如果是h5页面，不法分子很容易知道是如何生成签名的，因此需要动态获取秘钥key , 然后进行加密
         * 传输
         *
         * 默认判断接收到的时间戳 - 当前时间戳 > 120 , 也就是说2分钟后，链接失效
         *
         * 要求请求头中带有一下参数:
         * token: 令牌
         * ts: 10位时间戳 (必填)
         * nonce: 8位随机数，数字+字母(必填)
         * sign: 签名 (必填，如果不使用签名，可以随便填写，只是不能为空)
         *
         * 签名格式 data(字典升序) + token + key(随机生成的秘钥) + ts(当前时间戳timestamp) + nonce(随机数)
         * 思考一个问题:
         * 如果是app可以通过加密固化处理，但是前端h5该如何处理呢，如果将参与生成签名的key，
         * 放入到页面中，会导致任意一个人访问网站后都可以按F12查看源代码，就知道key了，同时也知道生成
         * 签名的流程，因此中间者可以修改参数后自己再重新生成签名。
         * 解决办法:
         * 前端在调用接口前随机生成一个字符串，然后通过rsa公钥进行加密处理，将加密结果传输到
         * 后端，后端存入到redis缓存中，失效时间设置为30s
         * 具体工作流程:
         *  1. 前端随机生成一个字符串，然后通过rsa公钥进行加密，将加密结果传输到后端，后端使用rsa私钥进行
         *  解密，将结果存入到缓存中,失效时间为30s
         *  2. 前端将 将所有非空参数按照升续排序然后 / body(请求体) + token + key + ts(当前时间戳) + nonce 进行拼接
         *     md5加密
         *  第一步，
         *  设所有发送或者接收到的数据为集合M，将集合M内非空参数值的参数按照参数名ASCII码从小到大排序（字典序），
         *  使用URL键值对的格式（即key1=value1&key2=value2…）拼接成字符串stringA 或者 body(请求体)为字符串stringA。
         *  特别注意以下重要规则：
         *      参数名ASCII码从小到大排序（字典序）；
         *      如果参数的值为空不参与签名；
         *      参数名区分大小写；
         *  第二步，
         *  在stringA最后拼接上 + token + key + ts(当前时间戳) + nonce 得到stringSignTemp字符串，
         *  并对stringSignTemp进行MD5运算，再将得到的字符串所有字符转换为大写，得到sign值signValue。
         *  第三步
         *  将 token , sign , ts , nonce 放入到请求头中访问后端
         */
        SIGN,
        /**
         * 加密
         */
        CRYPTO
}